var obj = {}; // 创建一个对象，默认会给这个对象添加一个__proto__属性。约等于 new Object()
// new Object。 所以obj.__proto__ = Object.prototype

function Person() {}

var p1 = new Person(); // 在创建对象实例的时候，会默认给对象实例隐式绑定一个__proto__原型，__proto__原型默认指向该类的prototype
var p2 = new Person();

console.log(Person);
console.log(p1 === p2); // false
console.log(p1.__proto__ === p2.__proto__); // true
console.log(p1.__proto__ === Person.prototype); // true

// function，拥有三个身份：对象、函数、类
// 所以也会给Person这个对象绑定一个__proto__
// 由此可知，我们定义函数的时候，相当于用函数类创建了一个函数对象，
// 这个函数对象默认绑定一个__proto__，这个__proto__指向Function.prototype
// 当然，这个函数类的顶层原型依旧是Object
console.log(Person.__proto__);
console.log(typeof Person.__proto__); // function
console.log(Function.prototype);
console.log(typeof Function.prototype);
console.log(Function.prototype.__proto__); // [Object: null prototype] {}

// 只有类（函数）才有prototype成员，对象不存在prototype成员。这也是检验对象是否是函数的一种判断方法
console.log(p1.prototype); // undefined
